<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // js存在很多的语法不合理的地方  

        // es5提出了严格模式  --- 部分的改善了一部分js语法不规范的地方
        //    1 变量必须声明才可以使用
        //    2 不能修改只读属性的值(比如说字符串的length属性就是只读属性)
        //    3 普通函数的this指向undefined
        //    4 不允许出现同名形参

        //  严格模式也是有作用域的

        //   严格模式一般需要写在顶端


        // 严格模式并没有解决所有的语法缺陷
        //    预编译也是不合理的  
        //     -> es6解决    let / const
        //     函数使用赋值式函数

        

        // 'use strict' ;

        // 非严格下，变量如果没有声明就直接使用就会成为全局变量
        // a = 1 ;   // 在严格模式下报错

        let str = 'hi';
        str.length = 5 ;   // 不能修改只读属性的值
        str += ' hello';
        console.log(str.length);


        const arr = [1,2,3];
        arr.length = 5 ;
        console.log(arr);

        fn(1,2)

        function fn(a , b) {
            'use strict';
            let str = 'hi';
            str.length = 5 ; 
            // 
            // b = 5 ;    // 没有报错   在函数内没有声明，会去外面去找   严格模式只在函数内部生效
            // 在严格模式下，普通函数的this指向了undefined
            console.log(a) ;   // undefined
        }

        

        

    </script>
    
</body>
</html>